/**
 * \file connexion.c
 * \author H4201
 */

/* MODULES USED */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include "connexion.h"

/*EXPORTED FUNCTIONS*/

/**
 * Fonction d'ouverture de connexion avec l'application de supervision
 * \param[in] numero_port Le port sur lequel écouter
 * \param[out] sockfd Le descripteur du socket serveur créé
 * \return Le descripteur du socket de connexion au client
 */
int ouvrir_connexion_supervision(int numero_port, int *sockfd) {
    int client_sockfd;
    socklen_t clilen;
    struct sockaddr_in serv_addr, cli_addr;
    
    // Mise en place du descripteur de socket
    *sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (*sockfd < 0) {
        perror("ERROR opening socket");
        exit(EXIT_FAILURE);
    }
    // Mise en place des informations de connexion
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(numero_port);
    // Mise en écoute
    if (bind(*sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
        perror("ERROR connecting");
        exit(EXIT_FAILURE);
    }
    // Attente des clients
    listen(*sockfd, 1);
    // Connexion au client
    clilen = sizeof(cli_addr);
    client_sockfd = accept(*sockfd, (struct sockaddr *) &cli_addr, &clilen);
    if (client_sockfd < 0) {
        perror("ERROR on accept");
        exit(EXIT_FAILURE);
    }
    return client_sockfd;
}

/**
 * Fonction de fermeture de la connexion avec l'application de supervision
 * \param[in] sockfd Le descripteur du socket serveur
 * \param[in] client_sockfd Le descripteur du socket client
 */
void fermer_connexion_supervision(int sockfd, int client_sockfd) {
    close(sockfd);
    close(client_sockfd);
}
